﻿using _2.AbstractFactoryPattern.Pattern;
using System;

namespace _2.AbstractFactoryPattern
{
    /*
     * 抽象工厂模式
     *
     * 意图：提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。
     *
     * 应用实例：工作了，为了参加一些聚会，肯定有两套或多套衣服吧，比如说有商务装（成套，一系列具体产品）、
     * 时尚装（成套，一系列具体产品），甚至对于一个家庭来说，可能有商务女装、商务男装、时尚女装、时尚男装，
     * 这些也都是成套的，即一系列具体产品。假设一种情况（现实中是不存在的，但有利于说明抽象工厂模式），
     * 在您的家中，某一个衣柜（具体工厂）只能存放某一种这样的衣服（成套，一系列具体产品），
     * 每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解，
     * 所有的衣柜（具体工厂）都是衣柜类的（抽象工厂）某一个，
     * 而每一件成套的衣服又包括具体的上衣（某一具体产品），裤子（某一具体产品），
     * 这些具体的上衣其实也都是上衣（抽象产品），具体的裤子也都是裤子（另一个抽象产品）。
     */
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Abstract Factory Pattern: ");
            var sharpFactory = AbstractFactoryProducer.GetFactory("Sharp");
            var circle = sharpFactory.GetSharp("Circle");
            var rect = sharpFactory.GetSharp("Rect");
            var square = sharpFactory.GetSharp("Square");
            circle.Draw();
            rect.Draw();
            square.Draw();

            var colorFactory = AbstractFactoryProducer.GetFactory("Color");
            var redColor = colorFactory.GetColor("Red");
            var greenColor = colorFactory.GetColor("Green");
            var blueColor = colorFactory.GetColor("Blue");
            redColor.Fill();
            greenColor.Fill();
            blueColor.Fill();
        }
    }
}
